package com.demo.utils;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.demo.utils.model.BaseEntityPlus;
import org.springframework.http.HttpEntity;
import sun.net.www.http.HttpClient;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Copyright
 *
 * @Author WuHuang
 * @Date 2025/6/9
 */
public class Test2 {
    public static void main(String[] args) {

//        System.out.println(System.getProperty("user.dir"));
//        generation("do_user");

            Map<String,Object> map = new HashMap<>();
            map.put("apikey","N136278fd5d");
            map.put("secret","1362789f7853409f9");
            map.put("sign_id","12345678");
            map.put("mobile","18135233326");
            map.put("content","发送了一条短信");
            String json = JSON.toJSONString(map);
            String post = HttpUtil.post("https://api.4321.sh/sms/send", json);
            System.out.println(post);

    }

    // module配置,多module需要指定对应
    private static String MODULE_NAME = "";
    // 数据库链接地址
    private static String URL = "jdbc:mysql://127.0.0.1:3306/ry-vue";
    // 数据库用户名
    private static String USERNAME = "root";
    // 数据库密码
    private static String PASSWORD = "root";

    public static void generation(String tableName) {
        // 6个主要的配置：pojo路径、dao路径、service路径、controller路径、mapper路径、xml文件路径
        FastAutoGenerator.create(URL, USERNAME, PASSWORD)

                // 全局配置
                .globalConfig(builder -> {
                    builder.author("wu")
                            // 用的knife4j,这里不需要启用swagger
                            //.enableSwagger()
                            .enableSpringdoc()
//                            .enableKotlin() // 开启 Kotlin 模式
                            .disableOpenDir() // 禁止打开输出目录
                            .dateType(DateType.TIME_PACK) // 时间类型为LocalDateTime
                            .commentDate("yyyy-MM-dd HH:mm:ss") // 注释日期格式
                            .outputDir(System.getProperty("user.dir") + "/" + MODULE_NAME + "/src/main/java")
                            .build(); // 指定输出目录
                })

                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.demo")
                            .entity("domain.entity")
                            .mapper("mapper")
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/" + MODULE_NAME + "/src/main/resources/mapper"))
                            .build();
                })

                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableName) // 表名
                            .addTablePrefix("do_") // 表名前缀
                            .enableSkipView() // 跳过视图

                            // 自定义实体类配置
                            .entityBuilder()
                            //父类
                            .superClass(BaseEntityPlus.class)
                            .addIgnoreColumns("create_by", "create_time", "update_by", "update_time", "deleted_flag") //添加忽略字段

                            .enableLombok() //使用自定义的entityLombokModel判断是否使用lombok 用@Data注解代替默认模版的 @Getter @Setter
                            .naming(NamingStrategy.underline_to_camel) // 数据表映射实体命名： 驼峰命名
                            .columnNaming(NamingStrategy.underline_to_camel) // 表字段映射实体命名： 驼峰命名
                            .idType(IdType.ASSIGN_ID)   // 主键策略 自增

                            // 自定义mapper配置
                            .mapperBuilder()
                            .enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成
                            .enableBaseColumnList()// 启用xml文件中的BaseColumnList
                            .formatMapperFileName("%sMapper")// 格式化Dao类名称

                            // 自定义service配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService")// 格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称

                            // 自定义controller配置
                            .controllerBuilder()
                            .formatFileName("%sController") // 格式化 controller 文件名称
                            .enableRestStyle()

                            .build();
                })


                // 自定义模板配置
                .templateConfig(builder -> {
                    builder.entity("/vm/entity.java")
                            .mapper("/vm/mapper.java")
                            .service("/vm/service.java")
                            .serviceImpl("/vm/serviceImpl.java")
                            .xml("/vm/mapper.xml")
                            .controller("/vm/controller.java");
                })

                // 注入自定义配置
                .injectionConfig(builder -> {
                    String pack = tableName.substring(tableName.indexOf("_") + 1);
                    //自定义生成模板参数,在vm模版里取值使用
                    Map<String, Object> data = new HashMap<>();
                    data.put("entityLombokModel", true);
                    data.put("chainModel", true);
                    data.put("tableName", tableName);
                    builder.customMap(data);

                    // 自定义DTO模版
                    List<CustomFile> customFiles = new ArrayList();

                    // DTO实体
//            CustomFile idReqFile = new CustomFile.Builder()
//                    .fileName("IdReq.java")//生成java文件名称，要和vm模版里的文件名保持一致
//                    .templatePath("/vm/domain.java.vm")//实体模板位置
//                    .packageName("domain.dto." + pack)//生成文件包名
//                    .build();
//            customFiles.add(idReqFile);
//
//            CustomFile queryFile = new CustomFile.Builder()
//                    .fileName("Query.java")//生成java文件名称，要和vm模版里的文件名保持一致
//                    .templatePath("/templates/query.java.vm")//实体模板位置
//                    .packageName("domain.dto." + pack)//生成文件包名
//                    .build();
//            customFiles.add(queryFile);
//
//            CustomFile saveFile = new CustomFile.Builder()
//                    .fileName("SaveReq.java")//生成java文件名称，要和vm模版里的文件名保持一致
//                    .templatePath("/templates/saveReq.java.vm")//实体模板位置
//                    .packageName("domain.dto." + pack)//生成文件包名
//                    .build();
//            customFiles.add(saveFile);
//
//            CustomFile updateFile = new CustomFile.Builder()
//                    .fileName("UpdateReq.java")//生成java文件名称，要和vm模版里的文件名保持一致
//                    .templatePath("/templates/updateReq.java.vm")//实体模板位置
//                    .packageName("domain.dto." + pack)//生成文件包名
//                    .build();
//            customFiles.add(updateFile);

                    // Vo实体
//            CustomFile customFileVO = new CustomFile.Builder()
//                    .fileName("VO.java")
//                    .templatePath("/vm/entityVo.java.vm")
//                    .packageName("domain.vo").build();
//            customFiles.add(customFileVO);

                    builder.customFile(customFiles);
                })

                .templateEngine(new VelocityTemplateEngine())
                .execute();
    }


}
